import { z } from 'zod';
import { pgTable, serial, text, timestamp, vector, index } from 'drizzle-orm/pg-core';
import { createInsertSchema } from 'drizzle-zod';

// 使用 Zod 定义应用层的数据验证规则
// 这通常用于 API 输入、表单提交等场景
export const knowledgeInsertSchema = z.object({
  content: z.string().min(1, "内容不能为空"),
  knowledgeType: z.enum(['task', 'document', 'conversation']),
  // embedding 可以在服务层生成，因此在插入时是可选的
  embedding: z.array(z.number()).length(1536).optional(),
});
export type KnowledgeInsert = z.infer<typeof knowledgeInsertSchema>;

// 使用 Drizzle ORM 定义数据库表 schema
export const knowledgeTable = pgTable('knowledge', {
  id: serial('id').primaryKey(),
  content: text('content').notNull(),
  knowledgeType: text('knowledge_type', { enum: ['task', 'document', 'conversation'] }).notNull(),
  embedding: vector('embedding', { dimensions: 1536 }).notNull(),
  createdAt: timestamp('created_at').defaultNow().notNull(),
}, (table) => {
  return {
    // 为元数据创建 btree 索引，用于快速过滤
    knowledgeTypeIdx: index('knowledge_type_idx').on(table.knowledgeType),
    // 为向量创建 HNSW 索引 (推荐)，假设 pgvector 版本支持
    // 注意: 创建索引的 SQL 通常在迁移文件中执行
    // CREATE INDEX ON knowledge USING hnsw (embedding vector_l2_ops);
    embeddingHnswIdx: index('embedding_hnsw_idx').using('hnsw', table.embedding.op('vector_l2_ops')),
  };
});

// (可选) 使用 drizzle-zod 从 Drizzle schema 生成 Zod schema
// 这对于验证从数据库查询出的数据或生成完整的 insert/select 类型非常有用
export const insertKnowledgeSchema = createInsertSchema(knowledgeTable);
